package com.dxf.chepter06

/**
 * trait 特质:  类似接口
 * 特质:
 * 类与类之间只支持单继承
 * 类与特质直接可以多继承
 * scala的特质中有普通字段,抽象字段,普通方法,抽象方法
 * 叫法:
 * 1 特质中只有抽象内容,这样的特质叫      瘦接口
 * 2 特质中既有内容,又又具体内容,叫       富接口
 *
 * 定义特质
 * trait 名称{
 * //普通字段
 * //抽象洗的
 * //普通方法
 * //抽象方法
 * }
 *
 * 继承特殊值
 *
 * class 类名 extents 特质1 with 特质2 with 特质3 {
 * //重写抽象方法
 * //重写抽象字段
 * //可重写普通字段和普通方法
 * }
 *
 *
 * =====================================
 *
 *
 * 对象混入 :
 * 类和特质直接无任何关系,在不改变继承体系下,对对象的功能进行增强或者扩展,使用对象混入计数
 *
 * 语法:
 * var/val 对象名 = new 类 with 特质
 *
 *
 *
 * =====================================
 *
 *
 * 特质实现适配器模式
 *
 * 适配器模式:
 * 1 当我们需要用到某几个方法时,不得不将改特质中的所有抽象方法重写 麻烦
 * 2 针对这种情况,我们可以定义一个抽象类去继承该特质,重写特质中的[所有]抽象方法,[所有]抽象方法体为空
 * 3 这时候,我们需要使用哪个方法,只需要定义类去继承抽象类,重写指定方法即可
 * 这个抽象类 就叫做适配器类
 *
 *
 * 结构:  类B为适配器类角色
 * trait 特质A{
 *
 * 抽象方法1
 * 抽象方法2
 * 抽象方法3
 *
 * }
 *
 * abstract class 类B extends 特质A {
 * 重写抽象方法1,方法体为空
 * 重写2 空
 * 重写3 空
 *
 *
 * }
 *
 *
 * class 类C extends 类B {
 * //需要使用哪个方法,重写哪个方法
 * }
 *
 * ===========================================================
 *
 *
 * 模板方法设计模式
 * 父类中实现模板方法(固定的方法)和抽象方法(不缺定的方法)
 * 子类自己实现抽象方法
 * 优点:
 * 1 扩展性更强
 * 2 符合开闭原则
 * 缺点:
 * 1 类个数增加 设计更加抽象
 *
 * 2 提高代码阅读难度
 *
 *
 * demo 打印110000字需要多少时间
 *
 */
object T69_模板方法设计模式 {
  def main(args: Array[String]): Unit = {

    var template: Template = new ForDemo
    println(template.getRuntime())
  }


  abstract class Template {
    def code()

    def getRuntime() = {
      val start = System.currentTimeMillis()
      code()
      val end = System.currentTimeMillis()
      end - start
    }
  }

  class ForDemo extends Template {
    override def code(): Unit = {
      for (i <- 1 to 10000) println("Hello,Scala")
    }
  }


}

